//
// Created by WuYong on 2021/12/21.
//

#include "Sequence_Stack.h"

Status InitStack(SqStack *S){

    S->base=(SElemType*) malloc(sizeof(SElemType)*STACK_INIT_SIZE);
    if(!S->base) exit(OVERFLOW);    //储存分配失败
    S->top=S->base;//栈的初始化
    S->StackSize=STACK_INIT_SIZE;
    return OK;
}  //构造一个空栈


Status DestroyStack(SqStack *S){
    if(S==NULL) return ERROR;//如果栈为空
    free(S->base);//释放栈的基地址所指向的连续空间
    free(S);//释放顺序栈空间
    S=NULL;//指针置空
    return OK;
}    //销毁栈S，S不再存在


Status ClearStack(SqStack *S){
    if(S==NULL||S->base==NULL) return ERROR;//错误情况
    S->top=S->base;//指针归位
    return OK;
}  //把S置为空栈


Status StackEmpty(SqStack S){
    if(S.base==NULL)    return ERROR;
    if(S.base==S.top)   return TRUE;
    else    return FALSE;
}   //若S为空栈返回TRUE，否则返回FALSE


int StackLength(SqStack S){
    if(S.base==NULL)    return ERROR;
    return (int)(S.top-S.base);//栈顶与栈底相差的字节数除以每个元素所占字节数
}     //返回S的元素个数，即栈的长度


SElemType* GetTop(SqStack S){
    SElemType *re;//用于保存要返回的数据
    if(S.top==S.base)   return NULL;
    re=(S.top-1);
    return re;
}  //若栈不空，则返回栈顶元素，否则返回NULL


Status Push(SqStack *S,SElemType e){
    if(S->top-S->base>=S->StackSize){   //栈满，追加存储空间
        S->base=(SElemType*) realloc(S->base,(S->StackSize+STACKINCREMENT)* sizeof(SElemType));
        if(!S->base) exit(OVERFLOW);    //存储分配失败
        S->top=S->base+S->StackSize;
        S->StackSize+=STACKINCREMENT;
    }
    *S->top++=e;
    return OK;
}    //插入元素e为新的栈顶元素


SElemType* Pop(SqStack *S){
    SElemType *re;
    if(S->top==S->base) return NULL;
    re=(--S->top);//不同于链式形式需要释放空间，直接将记号减一就好，下一次进行数据覆盖；
    return re;
}  //若栈不空，则删除栈顶元素并返回，否则返回NULL


Status StackTraverse(SqStack S,Status (*visit)(SElemType)){
    if(S.base==NULL)    return ERROR;
    SElemType *tmp=S.base;
    //逐个访问
    for (int i = 0; tmp!=(S.top) ; ++i) {
        visit(*tmp);
        tmp++;
    }
    return OK;
}     //从栈底到栈顶一次对栈中每个元素调用函数visit（），一旦visit（）失败，则返回ERROR